package loja;

import helpers.Categoria;
import helpers.Logger;

import java.rmi.RemoteException;
import java.sql.Date;
import java.sql.SQLException;
import java.util.Comparator;
import java.util.TreeSet;

import exceptions.ClienteErroLoginException;
import exceptions.ClienteJaExistenteException;
import exceptions.ClienteNaoEncontradoException;
import exceptions.ProdutoJaExistenteException;

public class ServidorSrv extends Servidor {

	private static final long serialVersionUID = 1L; 
	static{
		Logger.loginServidor();
	}

	/**
	 * Recupera a quantidade de produtos data uma determinada categoria; return
	 * inteiro quantidade de produtos entrada Categoria para ser verificada
	 */
	public int QuantidadeProdutosCategoria(Categoria c) {
		return Produto.getQuantidadeSrvByCategoriaFabricante(c, "ALL");
	}

	/**
	 * Remove um produto do carrinho deve ser inforado o produto e a quantidade
	 */
	public void removeAoCarrinho(Produto p, int quantidade) {
		p.adicionaQuantidadeCarrinho(quantidade);
	}

	/**
	 * Recupera um Cliente pelo seu Login gera excecao caso o cliente nao exista
	 * ou se o login informado estiver errado
	 */
	public Cliente getClienteByLogin(String login, String passwd)
			throws ClienteNaoEncontradoException, ClienteErroLoginException {
		return Cliente.getClienteByLogin(login, passwd);
	}

	/**
	 * Adiciona um produto no carrinho
	 * 
	 * @param p
	 *            - produto a ser adicionado
	 * @param quantidade
	 *            - quantidade a ser adicionada
	 * @throws RemoteException
	 */
	public void adicionaAoCarrinho(Produto p, int quantidade)
			throws RemoteException {
		p.retiraQuantidadeCarrinho(quantidade);
	}

	/**
	 * Retira um produto do carrinho
	 * 
	 * @param p
	 *            - produto a ser retirado
	 * @param quantidade
	 *            - quantidade a ser retirada
	 * @return - true se sucesso
	 * @throws RemoteException
	 */
	public boolean removeProdutoCarrinho(Produto p, int quantidade)
			throws RemoteException {
		return p.adicionaQuantidadeCarrinho(quantidade);
	}

	/**
	 * Cria um novo cliente
	 * 
	 * @param nome
	 * @param email
	 * @param login
	 * @param passwd
	 * @param cpf
	 * @param telefone
	 * @param rua
	 * @param numero
	 * @param cep
	 * @param credito
	 * @return
	 * @throws ClienteJaExistenteException
	 */
	public Cliente adicionarCliente(String nome, String email, String login,
			String passwd, String cpf, String telefone, String rua,
			String numero, String cep, Double credito)
			throws ClienteJaExistenteException {
		return Cliente.adicionarCliente(nome, email, login, passwd, cpf,
				telefone, rua, numero, cep, credito);
	}

	/**
	 * Cria um novo produto
	 * 
	 * @param quantidadeEstoque
	 * @param valorCompra
	 * @param valorVenda
	 * @param nome
	 * @param fabricante
	 * @param dataDeFabricacao
	 * @param categoria
	 * @return
	 * @throws ProdutoJaExistenteException
	 */
	public Produto adicionaProduto(int quantidadeEstoque, double valorCompra,
			double valorVenda, String nome, String fabricante,
			Date dataDeFabricacao, Categoria categoria)
			throws ProdutoJaExistenteException {
		return Produto.adicionaProduto(quantidadeEstoque, valorCompra,
				valorVenda, nome, fabricante, dataDeFabricacao, categoria);
	}

	public boolean enviaEmailEsqueceu(String login) throws RemoteException {
		try {
			Cliente.esqueceuSenha(login);
			return true;
		} catch (ClienteNaoEncontradoException e) {
			return false;
		}
	}

	public static TreeSet<Produto> getProdutosSrvByNome(Comparator<Produto> c,
			int primeiro, int quantidade, String busca) {
		return Produto.getProdutosSrvByNome(c, primeiro, quantidade, busca);
	}

	public static TreeSet<Produto> getProdutosSrvByCategoriaFabricante(
			Comparator<Produto> comparator, int primeiro, int quantidade,
			Categoria cat, String fabricante) {
		return Produto.getProdutosSrvByCategoriaFabricante(comparator,
				primeiro, quantidade, cat, fabricante);
	}

	public static int getQuantidadeSrvByCategoriaFabricante(Categoria cat,
			String fabricante) {
		return Produto.getQuantidadeSrvByCategoriaFabricante(cat, fabricante);
	}

	public static int getQuantidadeSrvByNome(String nome) {
		return Produto.getQuantidadeSrvByNome(nome);
	}
	public static void updateProduto(Produto p) throws SQLException {
		Produto.updateProduto(p);
		
	}

}
